home *** CD-ROM | disk | FTP | other *** search
/ Magnum One / Magnum One (Mid-American Digital) (Disc Manufacturing).iso / d22 / cpark.arc / PARK.C < prev    next >
C/C++ Source or Header  |  1991-07-03  |  3KB  |  128 lines

  1. /*
  2.  * Parks the system hard drives.
  3.  *
  4.  * Copyright 1991 Dave Dunfield
  5.  * All rights reserved.
  6.  */
  7. #include c:\mc\stdio.h
  8.  
  9.     int parms[12] = 2;        /* Default, 2 drives park via BIOS */
  10.  
  11.     extern char PSP[];        /* To determine address of COM start */
  12.  
  13. /*
  14.  * Main program - parse arguments, park drives
  15.  */
  16. main(argc, argv)
  17.     int argc;
  18.     int *argv[];
  19. {
  20.     int drive, cyl, flag;
  21.     FILE *fp;
  22.  
  23.     flag = cyl = 0;
  24.     for(drive = 1; drive < argc; ++drive) switch(*argv[drive]) {
  25.         case '?-' :        /* Help request */
  26.         case '?'  :
  27.             abort("\nUse: park [-s cyl1 cyl2 ...]\n\nCopyright 1991 Dave Dunfield\nAll rights reserved.\n");
  28.         case 's-' :        /* Setup command */
  29.         case 'S-' :
  30.             flag = -1;
  31.             break;
  32.         default:
  33.             if(!isdigit(*(char*)argv[drive]))
  34.                 abort("Invalid operand.");
  35.             parms[parms[0] = ++cyl] = atoi(argv[drive]); }
  36.  
  37.     if(flag) {                /* Setup mode */
  38.         putc('\n', stdout);
  39.         for(drive=1; drive <= *parms; ++drive) {
  40.             printf("Park drive %u ", drive);
  41.             if(flag = parms[drive])
  42.                 printf("at cylinder %u\n", flag);
  43.             else
  44.                 printf("via BIOS\n"); }
  45.         if(cyl) {            /* Set options */
  46.             fp = fopen("PARK.COM", "bwvq");
  47.             fwrite(0x100, PSP-0x102, fp);
  48.             fclose(fp);
  49.             printf("\nPARK.COM written!\n"); }
  50.         return; }
  51.  
  52.     printf("System shutdown in progress...\n\n");
  53.  
  54. #asm
  55.         MOV        AH,0Dh        ; Disk reset
  56.         INT        21h            ; Ask DOS
  57. #endasm
  58.  
  59.     for(drive = 1; drive <= *parms; ++drive) {
  60.         if(!test_disk(drive)) {
  61.             printf("Drive %u ", drive);
  62.             if(!(cyl = parms[drive]))
  63.                 cyl = max_cyl(drive);
  64.             flag = seek_disk(drive, cyl);
  65.             printf("parked at cylinder %u", cyl);
  66.             if(flag)
  67.                 printf(" - *flag %02x*", flag);
  68.             putc('\n', stdout); } }
  69.  
  70.     printf("\nTurn system power OFF now!!! ");
  71.  
  72.     while(getc(stdin) != '\n');
  73. }
  74.  
  75. /*
  76.  * Recalibrate the fixed disk (also determine its existance)
  77.  */
  78. test_disk(drive)
  79. { ;
  80. #asm
  81.         MOV        DL,4[BP]    ; Get drive id
  82.         ADD        DL,7fh        ; Offset to drive
  83.         MOV        AH,11h        ; Recalibrate
  84.         INT        13h            ; Ask BIOS
  85.         MOV        AL,AH        ; Set low value
  86.         XOR        AH,AH        ; Zero high
  87. #endasm
  88. }
  89.  
  90. /*
  91.  * Get the maximum cylinder number for drive
  92.  */
  93. max_cyl(drive)
  94. { ;
  95. #asm
  96.         MOV        DL,4[BP]    ; Get drive id
  97.         ADD        DL,7fh        ; Convert ID
  98.         MOV        AH,08h        ; Get parms function
  99.         INT        13h            ; Ask BIOS
  100.         MOV        AL,CH        ; Get LOW byte of result
  101.         MOV        AH,CL        ; Get HIGH two bits
  102.         MOV        CL,6        ; Shift 6 bits
  103.         SHR        AH,CL        ; Do the shift
  104. #endasm
  105. }
  106.  
  107. /*
  108.  * Seek to specified cylinder on fixed disk
  109.  */
  110. seek_disk(drive, cyl)
  111. { ;
  112. #asm
  113.         MOV        DL,6[BP]    ; Get drive id
  114.         ADD        DL,7fh        ; Convert to BIOS id
  115.         MOV        AL,5[BP]    ; Get high cylinder
  116.         MOV        CL,6        ; Shift 6 bits
  117.         SHL        AL,CL        ; Perform shift
  118.         INC        AL            ; Sector 1
  119.         MOV        CL,AL        ; Set high bits
  120.         MOV        CH,4[BP]    ; Get LOW cylinder
  121.         XOR        DH,DH        ; Head zero
  122.         MOV        AH,0Ch        ; Function 13 SEEK
  123.         INT        13h            ; Ask BIOS
  124.         MOV        AL,AH        ; Put RC in lower byte
  125.         XOR        AH,AH        ; Zero upper byte
  126. #endasm
  127. }
  128.